/*
 * Copyright (c) 2015, the Dart project authors.
 *
 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package vm.element

// This file is generated by the script: pkg/vm_service/tool/generate.dart in dart-lang/sdk.

import com.google.gson.JsonObject

/**
 * {@link SourceReportRange} 类表示运行程序中可执行代码的范围（函数、方法、
 * 构造函数等）。它是 SourceReport 的一部分。
 */
class SourceReportRange(json: JsonObject) : Element(json) {

    /**
     * 此范围的分支覆盖信息。仅在请求了 BranchCoverage 报告且范围已编译时提供。
     *
     * 可以返回 <code>null</code>。
     */
    fun getBranchCoverage(): SourceReportCoverage? {
        val obj = json.get("branchCoverage")?.asJsonObject ?: return null
        val type = json.get("type")?.asString
        if ("Instance" == type || "@Instance" == type) {
            val kind = json.get("kind")?.asString
            if ("Null" == kind) return null
        }
        return SourceReportCoverage(obj)
    }

    /**
     * 此范围是否已由 Dart VM 编译？
     */
    fun getCompiled(): Boolean {
        return getAsBoolean("compiled")
    }

    /**
     * 此范围的代码覆盖信息。仅在请求了 Coverage 报告且范围已编译时提供。
     *
     * 可以返回 <code>null</code>。
     */
    fun getCoverage(): SourceReportCoverage? {
        val obj = json.get("coverage")?.asJsonObject ?: return null
        val type = json.get("type")?.asString
        if ("Instance" == type || "@Instance" == type) {
            val kind = json.get("kind")?.asString
            if ("Null" == kind) return null
        }
        return SourceReportCoverage(obj)
    }

    /**
     * 此范围结束的标记位置。包含。
     */
    fun getEndPos(): Int {
        return getAsInt("endPos")
    }

    /**
     * 尝试编译此范围时出现的错误，如果此报告是使用
     * forceCompile=true 生成的。
     *
     * 可以返回 <code>null</code>。
     */
    fun getError(): ErrorRef? {
        val obj = json.get("error")?.asJsonObject ?: return null
        val type = json.get("type")?.asString
        if ("Instance" == type || "@Instance" == type) {
            val kind = json.get("kind")?.asString
            if ("Null" == kind) return null
        }
        return ErrorRef(obj)
    }

    /**
     * 此范围的可能断点信息，表示为排序的标记位置列表
     * （如果启用了 reportLines，则为行号）。仅在请求了
     * PossibleBreakpoint 报告且范围已编译时提供。
     *
     * 可以返回 <code>null</code>。
     */
    fun getPossibleBreakpoints(): List<Int>? {
        return getListInt("possibleBreakpoints")
    }

    /**
     * SourceReport 脚本表中的索引，指示哪个脚本包含此
     * 代码范围。
     */
    fun getScriptIndex(): Int {
        return getAsInt("scriptIndex")
    }

    /**
     * 此范围开始的标记位置。
     */
    fun getStartPos(): Int {
        return getAsInt("startPos")
    }
}
